#ifndef __INTERFACE_LCD_H__
#define __INTERFACE_LCD_H__

#include "stm32f10x.h"        
#include "Driver_FSMC.h"
#include "Common_Delay.h"
#include "stdio.h"
#include "math.h"



// 宏定义
// 定义写命令和写数据对应的地址指针
#define SRAM_BANK1_4 0x6C000000     //block3的bank1的区域4的基地址
//只对A10位进行操作，其他没有用到的地址总线A0~A28(除A10位)全置为0 
#define LCD_ADDR_CMD (uint16_t *)SRAM_BANK1_4                   //当A10=0时，表示写命令，所以地址是：0x6C00 0000。
#define LCD_ADDR_DATA (uint16_t *)(SRAM_BANK1_4 + (1 << 11))    //当A10=1时，表示写数据，所以地址是：0x6C00 0000 + 1<<11 = 0x6C00 0800


// 定义显示屏的宽和高
#define LCD_W 320
#define LCD_H 480

/* 常见颜色 */
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 // 棕色
#define BRRED 0XFC07 // 棕红色
#define GRAY 0X8430  // 灰色

/*----------------------------------------------------------------------------------*/
// 1. 基本底层控制操作
// 1.1初始化
void Interface_LCD_Init(void);

//  LCD初始化中包含以下函数
// 1.1.1 复位
void Interface_LCD_Reset(void);
// 1.1.2 开/关背光
void Interface_LCD_BGOn(void);
void Interface_LCD_BGOff(void);
// 1.1.3 初始化LCD寄存器，进行出厂调节，固定流程
void Interface_LCD_RegConfig(void);


/*----------------------------------------------------------------------------------*/
// 2. 具体的命令操作（我每实现一个具体的功能，都需要线规划好绘画区域，和发送写命令和写数据）

// 2.1 写命令（发出一个指令）
void Interface_LCD_WriteCMD(uint16_t cmd);

// 2.2 写数据（发出一个数据）
void Interface_LCD_WriteData(uint16_t data);

// 2.3 读数据
uint16_t Interface_LCD_ReadData(void);

// 2.4 设置绘画区域范围，给定起始点的坐标（行列号），以及区域的宽和高
void Interface_LCD_SetArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h);

/*----------------------------------------------------------------------------------*/
//3. 各种功能实现

//3.1 打印ID信息
void Interface_LCD_ReadId(void);
//3.2 清屏（设置全屏背景颜色）
void Interface_LCD_ClearSreen(uint16_t color);
//3.3 画单个ASCII字符方法
//参数：x--->要显示的位置的x坐标，y--->要显示的位置的y坐标，height--->要显示的字符的字体高度，c--->要显示的字符，fColor--->要显示的字符的字体颜色，bColor--->要显示的字符的背景颜色
void Interface_LCD_WriteASCIIChar(uint16_t x, uint16_t y, uint8_t height, uint8_t c, uint16_t fColor, uint16_t bColor);
//3.4 画ASCII字符串方法（会自动换行）
void Interface_LCD_WriteASCIIString(uint16_t x, uint16_t y, uint8_t height, uint8_t *str, uint16_t size, uint16_t fColor, uint16_t bColor);
//3.5 画汉字方法
void Interface_LCD_WriteChineseChar(uint16_t x, uint16_t y, uint8_t height, uint8_t index, uint16_t fColor, uint16_t bColor);
//3.6  画图方法（这里的logo是固定的）
void Interface_LCD_DrawImage(uint16_t x, uint16_t y);
//3.7  画点方法
void Interface_LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t w, uint16_t color);
//3.8  画线方法
void Interface_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t w, uint16_t color);
//3.9  画矩形方法
void Interface_LCD_DrawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t line_w, uint16_t color);
//3.10  画空心圆
void Interface_LCD_DrawCircle(uint16_t x, uint16_t y, uint16_t r, uint16_t w, uint16_t color);
//3.11  画空心圆(优化)
void Interface_LCD_DrawCircle_Pro(uint16_t x, uint16_t y, uint16_t r, uint16_t w, uint16_t color);
//3.12  画实心圆
void Interface_LCD_DrawFilledCircle(uint16_t x, uint16_t y, uint16_t r, uint16_t w, uint16_t fColor, uint16_t bColor);
//3.13  画实心圆（优化 ）
void Interface_LCD_DrawFilledCircle_Pro(uint16_t x, uint16_t y, uint16_t r, uint16_t w, uint16_t fColor, uint16_t bColor);



#endif
